/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package conductores;

import java.util.ArrayList;
import java.util.Random;

/**
 *
 * @author marc
 */

public class Context {
    
	private static Context INSTANCE = new Context();
	
    public static final int SIZE = 100;
    public static final int TOTALSIZE = 10000;
    public static final int MAXDIST = 300;
    
    public static final String SEPARATOR = "\t"; 
    public static final Point[] coordenadas = new Point[TOTALSIZE];    
    
    static {
    	for (int i = 0; i < SIZE; i++) {
            for (int j = 0; j < SIZE; j++) {
                coordenadas[i * SIZE + j] = new Point(j, i);
            }
        }
    }
    
    private static int numUsuarios;
    private static int numConductores;
    private static long seed;
    public static Random random; 
    public static ArrayList<IOperator> operaciones;
    public static Usuario[] usuarios;        

    private Context() {}

    public static Context getInstance() {
        return INSTANCE;
    }   
    
    public int getNombreUsuaris() {
    	return numUsuarios;
    }
    
    public void setNombreUsuaris(int num) {
    	numUsuarios = num;    	
    }
    
    public int getNumConductores() {
		return numConductores;
	}

	public void setNumConductores(int num) {
		numConductores = num;
	}
	
    public long getSeed() {
		return seed;
	}

	public void setSeed(long num) {
		seed = num;
	}
	
	public Usuario[] getUsuarios() {
		return usuarios;
	}
	
	public void init() {
		init(new Random());
	}
	
	public void init(long newseed) {		
		setSeed(newseed);		
		init(new Random(getSeed()));		
		
	}
	
	public Random getRandom() {
		return Context.random;
	}
	
	public void init(Random random) {
		Context.random = random;
		operaciones = new ArrayList<IOperator>();
		usuarios = new Usuario[numUsuarios];		
        for (int i = 0; i < numUsuarios; i++) {
            usuarios[i] = new Usuario(random.nextInt(TOTALSIZE), random.nextInt(TOTALSIZE));
        }
        
        for (int i = 0; i < numConductores;) {
        	int j = random.nextInt(numUsuarios);
        	if (!usuarios[j].esconductor) {
                usuarios[j].esconductor = true;
                i++;
            }
        }
	}
	
	public void addOperacion(IOperator operacion) {
		operaciones.add(operacion);
	}
	
	public void resetOperaciones() {
		operaciones.clear();
	}
	
	public ArrayList<IOperator> getOperaciones() {
		return operaciones;
	}
	
	public String toCSV() {
		String s = "Tablero inicial\n";
		
		for(int i=0; i < SIZE; i++) {
			for(int j=0; j < SIZE; j++) {				
				for(int u=0; u<usuarios.length; u++) {
					Usuario user = usuarios[u];
					Point origen = coordenadas[user.origen];
					Point destino = coordenadas[user.destino];
					if(origen.X == i && origen.Y == j) {
						s+= " " + u;
					} else if(destino.X == i && destino.Y == j) {
						s+= " " + (-u);
					}
				}
				s+= SEPARATOR;
			}
			s+= "\n";
		}
		return s;
	}
}